网站导航:首页开源项目 USB开源项目:Easy USB 51 Programer  

目录导航

   
  1、项目简介
USB开发基础
1、USB接口的优点及开发难易度
2、USB设备的开发流程
3、USB接口芯片(USB控制器)的选择
4、了解USB的通讯过程
5、USB命令(请求)和USB描述符
6、实例讲解USB的枚举(配置)过程
准备工作
1、需要哪些工具
2、电路原理图
3、手工制作您的电路板
4、测试您的硬件
HID设备类
1、让PC机找到我们的硬件
2、如何成为一个HID设备(模拟鼠标)
3、如何成为一个HID设备(模拟键盘)
4、如何与HID设备通讯(一)
5、如何与HID设备通讯(二)
6、51编程器的实现
Windows USB 驱动程序(自定义设备)
1、Windows驱动开发基础
2、开发环境配置
3、第一个实例-Hello Wdm(一)
4、第一个实例-Hello Wdm(二)
5、真正的实例—驱动我们的实验板
6、真正的实例—测试驱动程序
7、真正的实例—控制LED及读取按键状态
8、如何编写应用程序
   

相关产品    淘宝网店
     
 

 
  更多...  
 
 
让PC机找到我们的硬件 查看/参与此开源项目相关讨论
 

  此节的目的只是让PC能识别到硬件的插入(即识别到这是一个USB设备),其实质是要求我们能驱动PDIUSBD12,只要实现了这一步,说明PDIUSBD12的固件驱动已经完成一半了。一般,各厂商都供了各自USB接口芯片固件参考代码,我们只需要对这些代码作少量修改就能满足我们的要求,所以没有必要从零开始写固件驱动,这一定是个庞大的工程。 

第一步:固件下载

下载周立公编写的基于其一款开发板的PDIUSBD12固件程序。

点此下载

此固件程序基于PHILIPS公司提供PDIUSBD12固件驱动,选用周立公版是因为我们只需要对其再作小小改动即能适用于本项目的硬件。

第二步:修改D12Config.h文件

  主要是修改主控芯片的I/0引脚定义。

1、找到以下代码:

 
  1. #define     D12_COMMAND         0xff03  //D12 命令地址  

在其后面添加以下代码:

 
  1. #define     ucD12_DataPort      P1  //数据端口  

2、将以下几行代码:

 
  1. sbit MCU_D12CS    = P1 ^ 6;             //D12 片选引脚       
  2. sbit MCU_D12RST   = P1 ^ 7;             //D12 复位引脚       
  3. sbit MCU_D12SUSPD = P3 ^ 3;             //D12 挂起  

修改为:

 
  1.  sbit bD12_A0            = P2 ^ 3;               //数据/命令控制线           
  2. sbit bD12_WR            = P2 ^ 0;               //D12写控制线           
  3. sbit bD12_RD            = P3 ^ 3;               //D12读控制线   

第三步:修改D12HAL.C文件

  由于原固件是基于DMA方式的,而我们的硬件电路不支持DMA传输,所于主要是对这些部分作修改。

1、将以下两行注释掉: 

 
  1. MCU_D12CS = 1;          //释放D12       
  2. MCU_D12CS = 0;          //选择D12   

2、将以下几行注释掉:

 
  1. INT16U i;       
  2.       
  3. MCU_D12RST = 0;                 //D12的 RESET引脚置0       
  4. for(i = 0; i < 0x100; i++);     //软件延时       
  5.     MCU_D12RST = 1;             //D12的 RESET引脚置1       
  6.       
  7. MCU_D12SUSPD = 0;               //D12的 SUSPEND引脚置0    

3、将以下代码

 
  1. *((INT8U xdata *) Addr) = Data;      
  2. 修改为:   
  3.   
  4. if(Addr == D12_COMMAND) //命令       
  5. {       
  6.     bD12_A0     = 1;       
  7. }       
  8. else if(Addr == D12_DATA)   //数据       
  9. {       
  10.     bD12_A0     = 0;       
  11. }       
  12. else      
  13. {       
  14. }       
  15. ucD12_DataPort  = Data;       
  16. bD12_WR     = 0;       
  17. bD12_WR     = 1;     

修改为

 
  1. if(Addr == D12_COMMAND) //命令       
  2. {       
  3.     bD12_A0     = 1;       
  4. }       
  5. else if(Addr == D12_DATA)   //数据       
  6. {       
  7.     bD12_A0     = 0;       
  8. }       
  9. else      
  10. {       
  11. }       
  12. ucD12_DataPort  = Data;       
  13. bD12_WR     = 0;       
  14. bD12_WR     = 1;     

4、将以下代码

 
  1. return *((INT8U xdata *) Addr);    

全部修改为

 
  1. unsigned char ucTemp;       
  2. bD12_A0     = 0;    //选择数据       
  3. ucD12_DataPort      = 0xFF;       
  4. bD12_RD     = 0;       
  5. ucTemp      = ucD12_DataPort;       
  6. bD12_RD     = 1;       
  7. return ucTemp;   

第四步:修改D12Driver.c文件

将以下函数

 
  1. /*********************************************************************  
  2. ** 函数名称: Init_D12()  
  3. ** 功能描述: 设置D12与硬件的连接, 初始化D12, 复位D12  
  4. ** 输   入: 无  
  5. ** 输   出: 0: 初始化成功    1: 初始化失败    
  6. **********************************************************************/  
  7. INT8U Init_D12(void)   
  8. {   
  9.     bEPPflags.value = 0;                    //初始化USB事件标志变量   
  10.   
  11.     Init_D12Port();                         //初始化PDIUSBD12与51单片机连接的端口   
  12.     Rst_D12();                              //复位PDIUSBD12   
  13.     reconnect_USB();                        //重新连接USB   
  14.   
  15.     if (D12_ReadChipID() != 0x1012)         //读取芯片ID号,如果不为1012H   
  16.         return 1;                           //则复位失败   
  17.        
  18.     return 0;                               //初始化成功   
  19. }  

修改为

 
  1. /*********************************************************************  
  2. ** 函数名称: Init_D12()  
  3. ** 功能描述: 设置D12与硬件的连接, 初始化D12, 复位D12  
  4. ** 输   入: 无  
  5. ** 输   出: 0: 初始化成功    1: 初始化失败    
  6. **********************************************************************/  
  7. INT8U Init_D12(void)   
  8. {   
  9.     bEPPflags.value = 0;                    //初始化USB事件标志变量   
  10.   
  11.     Init_D12Port();                         //初始化PDIUSBD12与51单片机连接的端口   
  12.     Rst_D12();     
  13.     D12_SetAddressEnable(0,1);   
  14.     D12_SetEndpointEnable(1);                           //复位PDIUSBD12   
  15.     reconnect_USB();                        //重新连接USB   
  16.   
  17.     if (D12_ReadChipID() != 0x1012)         //读取芯片ID号,如果不为1012H   
  18.         return 1;                           //则复位失败   
  19.        
  20.     return 0;                               //初始化成功   
  21. }  

第五步:测试PC机是否能识别硬件

1、烧录编译后的HEX文件

2、将EUP51连接到电脑,如果一切顺利的话,LED灯会闪烁几下,然后电脑提示找到新硬件,否你您的硬件可能有问题,请参考"测试您的硬件"一节排除硬件故障。

修改好后的源程序:点击下载

附录:

快速判断主控芯片与D12是否连接正确的方法

1)、使用模式设置命令(0xF3)去改变D12第13脚的输出频率,如果可以改变,证明主控芯片向D12发送命令正确。
2)、使用读取ID命令(0xFD)去读,读回两个字节的內容,第一个字节应为0x12,第二个字节应为0x10。如果正确,则表明D12向单片机发送数据没有问题。

以上两步都通过了的话,证明硬件连接应该没有问题了。

  您如果使用仿真器进行开发的话将会非常方便,如果没有仿真器,可以使用扩展板EXT-BOARD-A上的串行接口将一些需要的信息发送到PC机上。以下是我们通过串行口向PC机发送的D12枚举的过程: 

 
  1. Chip ID:1012   
  2. Power on reset!   
  3. Suspend changed!(Wait for 3 EOT failure)   
  4. Suspend changed!(Wait for 3 EOT failure)   
  5. Power on reset!   
  6. Suspend changed!(Wait for 3 EOT failure)   
  7. Control point out!   
  8. ---------标准命令请求!------------   
  9. GET_DESCRIPTOR->DEVICE   
  10. Control point in!   
  11. Power on reset!   
  12. Control point out!   
  13. ---------标准命令请求!------------   
  14. SET_ADDRESS->258   
  15. Control point in!   
  16. Control point out!   
  17. ---------标准命令请求!------------   
  18. GET_DESCRIPTOR->DEVICE   
  19. Control point in!   
  20. Control point in!   
  21. Control point out!   
  22. ---------标准命令请求!------------   
  23. GET_DESCRIPTOR->CONFIGURATION   
  24. Control point in!   
  25. Control point out!   
  26. ---------标准命令请求!------------   
  27. GET_DESCRIPTOR->STRING->LANGUAGE ID.   
  28.   
  29. Control point in!   
  30. Control point out!   
  31. ---------标准命令请求!------------   
  32. GET_DESCRIPTOR->STRING->DEVICE SERIAL NO.   
  33.   
  34. Control point in!   
  35. Control point in!   
  36. Control point in!   
  37. Control point out!   
  38. ---------标准命令请求!------------   
  39. GET_DESCRIPTOR->CONFIGURATION   
  40. Control point in!   
  41. Control point in!   
  42. Control point in!   
  43. Control point out!   
  44. ---------标准命令请求!------------   
  45. GET_DESCRIPTOR->STRING->LANGUAGE ID.   
  46.   
  47. Control point in!   
  48. Control point out!   
  49. ---------标准命令请求!------------   
  50. GET_DESCRIPTOR->STRING->PRODUCT.   
  51.   
  52. Control point in!   
  53. Control point in!   
  54. Control point in!   
  55. Control point in!   
  56. Control point out!   
  57. ---------标准命令请求!------------   
  58. GET_DESCRIPTOR->STRING->LANGUAGE ID.   
  59.   
  60. Control point in!   
  61. Control point out!   
  62. ---------标准命令请求!------------   
  63. GET_DESCRIPTOR->STRING->PRODUCT.   
  64.   
  65. Control point in!   
  66. Control point in!   
  67. Control point in!   
  68. Control point in!   
  69. Control point out!   
  70. ---------标准命令请求!------------   
  71. GET_DESCRIPTOR->DEVICE   
  72. Control point in!   
  73. Control point in!   
  74. Control point out!   
  75. ---------标准命令请求!------------   
  76. GET_DESCRIPTOR->CONFIGURATION   
  77. Control point in!   
  78. Control point out!   
  79. ---------标准命令请求!------------   
  80. GET_DESCRIPTOR->CONFIGURATION   
  81. Control point in!   
  82. Control point in!   
  83. Control point in!   
  84. Control point out!   
  85. ---------标准命令请求!------------   
  86. SET_CONFIGURATION   
  87. Control point in!   
  88. Control point out!   
  89. ---------类请求!------------   
  90. SET_IDLE   
  91. Control point in!   
  92. Control point out!   
  93. ---------标准命令请求!------------   
  94. GET_DESCRIPTOR->REPORT   
  95. Control point in!   
  96. Control point in!   
  97. Control point in!   
  98. Control point in!   
  99. Control point out!  

点击这里下载嵌入了串口调试的固件程序源代码(此代码模拟了一个鼠标)

 
 
 
本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4